package com.green.springsecuritydemo1.controller;

import com.green.springsecuritydemo1.entity.MyUser;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreFilter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping("/test1")
    public String test1(){
        return "test1";
    }


    //测试preAuthorize注解

    /**
     * 使用类、方法上，拥有指定的权限才可以访问
     * String类型的参数，语法是Spring的EL表达式
     * @return
     *
     * hasRole是去找权限的，会默认加上ROLE_前缀去找
     * hasAuthority是去找对应的权限，不会做额外的操作
     */
//    @PreAuthorize("hasRole('test1:show')")
    @PreAuthorize("hasAuthority('test1:show')")
    @GetMapping("/test2")
    public String test2(){
        return "test2";
    }


    /**
     * 对返回值进行校验
     * @return
     */
    @PreAuthorize("hasAuthority('user:name')")
    @PostAuthorize("returnObject.length() > 3")
    @GetMapping("/test3")
    public String test3(){
        return "te";
    }

    /**
     * PreFilter:过滤符合条件的数据进入接口
     * PostFilter：过滤符合条件的数据返回
     * @return
     */
    @PreAuthorize("hasAuthority('user:list')")
    @PostFilter(value = "filterObject.length() >= 3")
    @GetMapping("/test4")
    public List<String> test4(){
        System.out.println("test4");
        List<String> userList = new ArrayList<>();
        userList.add("提莫");
        userList.add("卑尔维斯");
        userList.add("三个字");
        return userList;
    }

    /**
     * PreFilter:过滤符合条件的数据进入接口
     * 数据必须是Collection、map、Array数据
     * @return
     */
    @PreFilter(value = "filterObject.username.length() >= 3")
    @GetMapping("/test5")
    public List<MyUser> test5(@RequestBody List<MyUser> userList){
        for (MyUser myUser : userList) {
            System.out.println("========="+myUser.getUsername());
        }
        return userList;
    }
}
